/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.servlet.niceshot;

import br.com.niceshot.PassToMD5;
import br.com.pessoa.niceshot.PessoaQueries;
import br.com.usuario.niceshot.UsuarioQueries;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "UsuarioServlet", urlPatterns = {"/UsuarioServlet"})
public class UsuarioServlet extends HttpServlet {

    UsuarioQueries pQueries = new UsuarioQueries();

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("application/json");

        processRequest(request, response);

        try (PrintWriter out = response.getWriter()) {

            String idUsuario = request.getParameter("id");
            String acao = request.getParameter("acao");
            if (idUsuario != null) {
                if (acao.equals("remover")) {
                    out.println(removeUsuario(idUsuario));
                } else {
                    out.println(editUsuario(idUsuario));
                }
            } else {
                String nmFuncionario = request.getParameter("nmFuncionario");
                out.println(buscaFuncionario(nmFuncionario));
            }
        }
    }

    private String editUsuario(String idUsuario) {
        Map<String, String> objUsuario = pQueries.SelectByID(idUsuario, "Usuario");
        String JsonUsuario = pQueries.HashMapToJson("Usuario", objUsuario);
        String JsonTipoUsuario = pQueries.HashMapToJson("TipoUsuario", pQueries.SelectByID(objUsuario.get("id_tipo_usuario"), "tipo_usuario"));
        Map<String, String> objFuncionario = pQueries.SelectByID(objUsuario.get("id_funcionario"), "funcionario");
        String JsonPessoa = pQueries.HashMapToJson("Pessoa", pQueries.SelectByID(objFuncionario.get("id_pessoa"), "Pessoa"));
        ArrayList<Object> objTipoUsuario = pQueries.SelectAll("tipo_usuario");
        String JsonArrTipoUsuario = pQueries.ArrayObjectHashMapToJson("ArrTipoUsuario", objTipoUsuario);
        String dataJson = "{" + JsonUsuario + "," + JsonPessoa + "," + JsonTipoUsuario + "," + JsonArrTipoUsuario + "}";

        return dataJson;
    }

    private String removeUsuario(String idUsuario) {
        return pQueries.RemoveData("Usuario", "id_usuario", idUsuario);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
        try (PrintWriter out = response.getWriter()) {

            PassToMD5 senhaMD5 = new PassToMD5();

            String idUsuario = request.getParameter("id_usuario");
            String nmUsuario = request.getParameter("nm_usuario");
            String idFuncionario = request.getParameter("id_funcionario");
            String cdSenha = request.getParameter("cd_senha");
            String icSituacao = request.getParameter("ic_situacao");
            String idTipoUsuario = request.getParameter("id_tipo_usuario");

            LinkedHashMap<String, String> dataUsuario = new LinkedHashMap<String, String>();

            if (idUsuario.length() < 1) {
                dataUsuario.put("id_usuario", null);
            } else {
                dataUsuario.put("id_usuario", idUsuario);
            }
            dataUsuario.put("nm_usuario", "'" + nmUsuario + "'");
            dataUsuario.put("id_funcionario", idFuncionario);
            dataUsuario.put("cd_senha", "'" + senhaMD5.CriptografaSenha(cdSenha) + "'");
            dataUsuario.put("ic_situacao", "'" + icSituacao + "'");
            dataUsuario.put("id_tipo_usuario", idTipoUsuario);

            out.println(insertUsuario(dataUsuario));
        } catch (Exception ex) {
            Logger.getLogger(UsuarioServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private String insertUsuario(LinkedHashMap<String, String> dataUsuario) {

        if (dataUsuario.get("id_usuario") == null) {
            if (verificaUsuario(dataUsuario.get("nm_usuario")).equals("")) {
                return pQueries.InsertData("usuario", dataUsuario);
            } else {
                return "Indisponivel";
            }
        } else {
            if (!verificaUsuario(dataUsuario.get("nm_usuario")).equals(dataUsuario.get("id_usuario"))) {
                return "Indisponivel";
            } else {
                return pQueries.UpdateData("usuario", dataUsuario);
            }
        }
    }

    private String verificaUsuario(String login) {
        return pQueries.checkLoginAvailable(login);
    }

    private String buscaFuncionario(String nmFuncionario) {
        return "{" + pQueries.HashMapToJson("BuscaFuncionario", pQueries.SelectLikePessoa(nmFuncionario, "funcionario")) + "}";
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "UsuarioServlet";
    }// </editor-fold>

}
